package actions.entregas;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import services.entrega.EntregaService;
import services.venta.VentaService;
import util.GSonHelper;
import util.SearchOperator;
import actions.base.BaseAction;

import com.google.gson.Gson;

import dto.EntregaDTO;
import dto.SearchDTO;
import dto.VentaDTO;
import exceptions.CannotDeleteException;
import exceptions.CannotSaveException;
import exceptions.EntityNotFoundException;

public class EntregaAction extends BaseAction {
	
	private static final long serialVersionUID = 1L;

	private EntregaService entregaService;
	
	private VentaService ventaService;
	
	private EntregaDTO entregaDTO;
	
	private Date fechaInicio;
	
	private Date fechaFin;
	
	private String query;
	
	@Override
	public String execute() {
		return SUCCESS;
	}
	
	/**
	 * Agrega un nuevo entrega
	 * @return
	 */
	public String agregar() {
		
		// TODO hacer validaciones
		
		try {
			entregaService.save(entregaDTO);
		} catch (CannotSaveException e) {
			setOk("false");
			setMensaje("No se ha podido almacenar el entrega");
			return SUCCESS_AGREGAR;
		}
		setOk("true");
		setMensaje("La entrega se ha almacenado correctamente");
		return SUCCESS_AGREGAR;
	}
	
	/**
	 * Borra un entrega
	 * @return
	 */
	public String borrar() {
		
		// TODO hacer validacion sobre ID
		
		try {
			entregaService.delete(id);
		} catch (CannotDeleteException e) {
			setOk("false");
			setMensaje("La entrega no se ha podido eliminar");
			return SUCCESS_AGREGAR;
		}
		setOk("true");
		setMensaje("El entrega se ha eliminado correctamente");
		return SUCCESS_AGREGAR;
	}

	/**
	 * Obtiene una lista de todos los entregas
	 * @return	la lista
	 */
	public String getEntregas() {

		List<EntregaDTO> entregas = entregaService.findAll("id", false);
		
		Gson gson = GSonHelper.getInstance();
		String entregasStr = gson.toJson(entregas);
		
		setLista(entregasStr);
		return SUCCESS_LISTADO;
	}
	
	/**
	 * Obtiene un entrega
	 * @return el entrega
	 */
	public String getEntrega() {
		
		// TODO validacion sobre ID
		
		EntregaDTO entregaDTO = null;
		try {
			entregaDTO = entregaService.findById(id);
		} catch (EntityNotFoundException e) {
			e.printStackTrace();
		}
		
		// Obtiene la venta relacionada
		SearchDTO searchDTO = new SearchDTO();
		searchDTO.addCriteria("entrega.id", entregaDTO.getId(), SearchOperator.EQUAL);
		List<VentaDTO> ventaDTOList = ventaService.search(searchDTO);
		if (ventaDTOList != null && ventaDTOList.size() > 0) {
			entregaDTO.setVentaDTO(ventaDTOList.get(0));
		}
		
		Gson gson = GSonHelper.getInstance();
		String entregaStr = gson.toJson(entregaDTO);
		setLista(entregaStr);
		return SUCCESS_JSON;
	}
	
	/**
	 * Obtiene una lista de entregas para mostrar en un listado 'typeahead'
	 * @return	la lista json
	 */
	public String getEntregaList() {
		
		SearchDTO searchDTO = new SearchDTO();
		searchDTO.addCriteria("descripcion", getQuery(), SearchOperator.LIKE);
		
		List<EntregaDTO> entregas = entregaService.search(searchDTO);
		
		Gson gson = new Gson();
		String entregasStr = gson.toJson(entregas);
		
		setLista(entregasStr);
		return SUCCESS_LISTADO;
	}

	
	/**
	 * Busca entregas
	 */
	public String buscar() {
		
		// TODO validacion sobre DTO
		
		SearchDTO searchDTO = new SearchDTO();
		String estado = entregaDTO.getEstado();
		if (estado != null && !estado.isEmpty()) {
			searchDTO.addCriteria("estado", entregaDTO.getEstado(), SearchOperator.EQUAL, "entrega");
		}
		searchDTO.addBeetwenCriteria("fecha", fechaInicio, fechaFin);
		
		List<VentaDTO> ventaDTOList = ventaService.search(searchDTO);
		List<EntregaDTO> entregasDTOList = new ArrayList<EntregaDTO>();
		for (VentaDTO ventaDTO : ventaDTOList) {
			entregasDTOList.add(ventaDTO.getEntregaDTO());
		}
		
		Gson gson = GSonHelper.getInstance();
		String entregasStr = gson.toJson(entregasDTOList);
		
		setLista(entregasStr);
		return SUCCESS_LISTADO;
	}
	
	
	/**
	 * Getters & Setters
	 */
	public EntregaDTO getEntregaDTO() {
		return entregaDTO;
	}

	public String getQuery() {
		return query;
	}

	public void setQuery(String query) {
		this.query = query;
	}

	public void setEntregaDTO(EntregaDTO entregaDTO) {
		this.entregaDTO = entregaDTO;
	}
	
	public Date getFechaInicio() {
		return fechaInicio;
	}

	public void setFechaInicio(Date fechaInicio) {
		this.fechaInicio = fechaInicio;
	}

	public Date getFechaFin() {
		return fechaFin;
	}

	public void setFechaFin(Date fechaFin) {
		this.fechaFin = fechaFin;
	}

	public EntregaService getEntregaService() {
		return entregaService;
	}

	public void setEntregaService(EntregaService entregaService) {
		this.entregaService = entregaService;
	}

	public VentaService getVentaService() {
		return ventaService;
	}

	public void setVentaService(VentaService ventaService) {
		this.ventaService = ventaService;
	}
	
}
